# 03. ECMAScript 6

Assembled by GimunLee

# ๊ฐœ์š”

Angular๋Š” TypeScript๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๋„๊ตฌ์˜ ์ง€์›์„ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. TypeScriptsms ES5์˜ ์ƒ์šฐ์ง‘ํ•ฉ(Superset)์ด๋ฏ€๋กœ ES5์˜ ๋ฌธ๋ฒ•์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Babel๊ณผ ๊ฐ™์€ ๋ณ„๋„์˜ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๊ธฐ์กด์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„(๋ธŒ๋ผ์šฐ์ € ๋˜๋Š” Node.js)์—์„œ ES6์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.


# 1) let, const์™€ ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„

# ๊ฐœ์š”

ES5์—์„œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ var ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํŠน์ง•์ด ์žˆ๋‹ค.

  • ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„: ์ „์—ญ ๋ณ€์ˆ˜์˜ ๋‚จ๋ฐœ. for ๋ฃจํ”„์˜ ์ดˆ๊ธฐํ™” ์‹์—์„œ ์‚ฌ์šฉํ•œ ๋ณ€์ˆ˜๋ฅผ for ๋ฃจํ”„ ์™ธ๋ถ€ ๋˜๋Š” ์ „์—ญ์—์„œ ์ฐธ์กฐ ๊ฐ€๋Šฅ

  • var ํ‚ค์›Œ๋“œ ์ƒ๋žต ํ—ˆ์šฉ: ์˜๋„ํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜์˜ ์ „์—ญํ™”

  • ์ค‘๋ณต ์„ ์–ธ ํ—ˆ์šฉ: ์˜๋„ํ•˜์ง€ ์•Š์€ ๋ณ€์ˆซ๊ฐ’ ๋ณ€๊ฒฝ

  • **๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…: ** ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ธฐ ์ „์— ์ฐธ์กฐ ๊ฐ€๋Šฅ

๋Œ€๋ถ€๋ถ„ ๋ฌธ์ œ๋Š” ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์ธํ•ด ๋ฐœ์ƒํ•œ๋‹ค. ๋ณ€์ˆ˜์˜ ์œ ํšจ ๋ฒ”์œ„๋Š” ์ข์„์ˆ˜๋ก ์ข‹๋‹ค.

# let

# ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„

๋Œ€๋ถ€๋ถ„์˜ C-family ์–ธ์–ด๋Š” ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๋Š”๋‹ค.

  • ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„(Function-level scope): ํ•จ์ˆ˜ ๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ ์œ ํšจํ•˜๋ฉฐ ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ๋Š” ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค. ์ฆ‰ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์ง€์—ญ ๋ณ€์ˆ˜์ด๋ฉฐ ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๋ชจ๋‘ ์ „์—ญ ๋ณ€์ˆ˜์ด๋‹ค.
  • **๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„(Block-level scope): ** ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด์—์„œ๋งŒ ์œ ํšจํ•˜๋ฉฐ ์ฝ”๋“œ ๋ธ”๋ก ์™ธ๋ถ€์—์„œ๋Š” ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค.

var ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ

console.log(foo); // undefined
var foo = 123; // ์ „์—ญ ๋ณ€์ˆ˜
console.log(foo); // 123
{
	var foo = 456; // ์ค‘๋ณต ์„ ์–ธ ํ—ˆ์šฉ
}
console.log(foo); // 456

let ํ‚ค์›Œ๋“œ(๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„) ์‚ฌ์šฉ

let foo = 123;
{
  let foo = 456; 
  let bar = 456;
}
console.log(foo); // 123
console.log(bar); // ReferenceError: bar is not defined

# ์ค‘๋ณต ์„ ์–ธ ๊ธˆ์ง€

var ํ‚ค์›Œ๋“œ๋กœ๋Š” ์ด๋ฆ„์ด ๊ฐ™์€ ๋ณ€์ˆ˜๋ฅผ ์ค‘๋ณตํ•ด์„œ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ, let ํ‚ค์›Œ๋“œ๋กœ๋Š” ์ด๋ฆ„์ด ๊ฐ™์€ ๋ณ€์ˆ˜๋ฅผ ์ค‘๋ณตํ•ด์„œ ์„ ์–ธํ•˜๋ฉด ๋ฌธ๋ฒ• ์—๋Ÿฌ(SyntaxError)๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

var foo = 123;
var foo = 456; // ์ค‘๋ณต ์„ ์–ธ ํ—ˆ์šฉ

let bar = 123;
let bar = 456; // Uncaught SyntaxError: Identifier 'bar' has already been declared

# ํ˜ธ์ด์ŠคํŒ…(Hoisting)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ES6์—์„œ ๋„์ž…๋œ let, const๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  ์„ ์–ธ(var, let, const, function, function *, class)์„ ํ˜ธ์ด์ŠคํŒ…ํ•œ๋‹ค. ํ˜ธ์ด์ŠคํŒ…์ด๋ž€, var ์„ ์–ธ๋ฌธ์ด๋‚˜ function ์„ ์–ธ๋ฌธ ๋“ฑ์„ ํ•ด๋‹น ์Šค์ฝ”ํ”„์˜ ์„ ๋‘๋กœ ์˜ฎ๊ธด ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ํŠน์„ฑ์„ ๋งํ•œ๋‹ค.

ํ•˜์ง€๋งŒ let ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์„ ์–ธ๋ฌธ ์ด์ „์— ์ฐธ์กฐํ•˜๋ฉด ์ฐธ์กฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋Š” let ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์Šค์ฝ”ํ”„์˜ ์‹œ์ž‘์—์„œ ๋ณ€์ˆ˜์˜ ์„ ์–ธ๊นŒ์ง€ ์ผ์‹œ์  ์‚ฌ๊ฐ์ง€๋Œ€(TDZ, Temporal Dead Zone) ์— ๋น ์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

console.log(foo); // undefined
var foo;

console.log(bar); // Error: Uncaught ReferenceError: bar is not defined
let bar;

๋ณ€์ˆ˜๋Š” 3๋‹จ๊ณ„์— ๊ฑธ์ณ ์ƒ์„ฑ๋œ๋‹ค.

  • ์„ ์–ธ ๋‹จ๊ณ„(Declaration phase): ๋ณ€์ˆ˜๋ฅผ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€์ˆ˜ ๊ฐ์ฒด(Variable Object)์— ๋“ฑ๋กํ•œ๋‹ค. ์ด ๋ณ€์ˆ˜ ๊ฐ์ฒด๋Š” ์Šค์ฝ”ํ”„๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋Œ€์ƒ์ด ๋œ๋‹ค.
  • ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„(Initialization phase): ๋ณ€์ˆ˜ ๊ฐ์ฒด์— ๋“ฑ๋ก๋œ ๋ณ€์ˆ˜๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„์„ ๋ฉ”๋ชจ๋ฆฌ์— ํ™•๋ณดํ•œ๋‹ค. ์ด ๋‹จ๊ณ„์—์„œ ๋ณ€์ˆ˜๋Š” undefined๋กœ ์ดˆ๊ธฐํ™” ๋œ๋‹ค.
  • ํ• ๋‹น ๋‹จ๊ณ„(Assignment phase): undefined๋กœ ์ดˆ๊ธฐํ™”๋œ ๋ณ€์ˆ˜์— ์‹ค์ œ ๊ฐ’์„ ํ• ๋‹นํ•œ๋‹ค.

var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์„ ์–ธ ๋‹จ๊ณ„์™€ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๊ฐ€ ํ•œ๋ฒˆ์— ์ด๋ฃจ์–ด์ง„๋‹ค. ํ•˜์ง€๋งŒ let ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์„ ์–ธ ๋‹จ๊ณ„์™€ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์ง„ํ–‰๋œ๋‹ค. ์ฆ‰, ์Šค์ฝ”ํ”„์— ๋ณ€์ˆ˜๋ฅผ ๋“ฑ๋ก(์„ ์–ธ ๋‹จ๊ณ„)ํ•˜์ง€๋งŒ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๋Š” ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ์ด๋ฃจ์–ด์ง„๋‹ค. ์Šค์ฝ”ํ”„์˜ ์‹œ์ž‘ ์ง€์ ๋ถ€ํ„ฐ ์ดˆ๊ธฐํ™” ์‹œ์ž‘ ์ง€์ ๊นŒ์ง€์˜ ๊ตฌ๊ฐ„์„ '์ผ์‹œ์  ์‚ฌ๊ฐ์ง€๋Œ€(Temporal Dead Zone)' ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๊ฒฐ๊ตญ ES6์—์„œ๋Š” ํ˜ธ์ด์Šคํ‹์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ์ฐจ์ด๊ฐ€ ์—†์–ด ๋ณด์ธ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.

let foo = 1; // ์ „์—ญ ๋ณ€์ˆ˜
{
  // let foo; // ํ˜ธ์ด์ŠคํŒ…
	console.log(foo); // ReferenceError: foo is not defined
	let foo = 2;
}

์œ„์˜ ์˜ˆ์ œ๋Š” ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

# ์ „์—ญ ๊ฐ์ฒด์™€ let

์ „์—ญ ๊ฐ์ฒด(Global Object)๋Š” ๋ชจ๋“  ๊ฐ์ฒด์˜ ์œ ์ผํ•œ ์ตœ์ƒ์œ„ ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ € ์‚ฌ์ด๋“œ์—์„œ๋Š” window ๊ฐ์ฒด, ์„œ๋ฒ„ ์‚ฌ์ด๋“œ(Node.js)์—์„œ๋Š” global ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค. var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์ „์—ญ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋œ๋‹ค.

var foo = 123; // ์ „์—ญ ๋ณ€์ˆ˜
console.log(window.foo); // 123

let ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, let ์ „์—ญ ๋ณ€์ˆ˜๋Š” ์ „์—ญ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์ฆ‰, window.foo์™€ ๊ฐ™์ด ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. let ์ „์—ญ ๋ณ€์ˆ˜๋Š” ๋ณด์ด์ง€ ์•Š๋Š” ๊ฐœ๋…์ ์ธ ๋ธ”๋ก ๋‚ด์— ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค.

let foo = 123; // ์ „์—ญ ๋ณ€์ˆ˜
console.log(window.foo); // undefined

#

Last Updated: 8/12/2020, 1:33:42 PM